using System;
using System.Drawing;

namespace Wilco.SyntaxHighlighting
{
	/// <summary>
	/// Represents a PHP syntax highlighter.
	/// </summary>
	public class PHPHighlighter : HighlighterBase
	{
		/// <summary>
		/// Initializes a new instance of a <see cref="Wilco.SyntaxHighlighting.PHPHighlighter"/> class.
		/// </summary>
		public PHPHighlighter() : this(null)
		{
			//
		}

		/// <summary>
		/// Initializes a new instance of a <see cref="Wilco.SyntaxHighlighting.PHPHighlighter"/> class.
		/// </summary>
		/// <param name="parser">The parser which will be used to parse the source code.</param>
		public PHPHighlighter(IParser parser) : base(parser)
		{
			this.Name = "PHP";
			this.FullName = "PHP";
			this.TagValues.AddRange(new String[] { "php" });
			this.FileExtensions.AddRange(new String[] { "php", "php3" });
		}

        /// <summary>
        /// Creates a new instance (clone) of this highlighter.
        /// </summary>
        /// <returns></returns>
        public override HighlighterBase Create()
        {
            return new PHPHighlighter(this.Parser);
        }

		/// <summary>
		/// Builds a new chain of scanners.
		/// </summary>
		/// <param name="tokenizer">The tokenizer used by the scanners.</param>
		/// <param name="scannerResult">The scanner result.</param>
		/// <returns>
		/// The scanner at the start of the chain.
		/// </returns>
		public override IScanner BuildEntryPointScanner(TokenizerBase tokenizer, OccurrenceCollection scannerResult)
		{
			this.Tokenizer = tokenizer;
			this.ScannerResult = scannerResult;

			IScanner wordScanner = this.BuildWordScanner();

			StringLineScanner stringScanner = (StringLineScanner)this.BuildStringScanner();
			stringScanner.StringNode.Entities.Add(new StringEntity("'", "'", "\\"));
			stringScanner.Child = wordScanner;

			CommentLineScanner commentLineScanner = (CommentLineScanner)this.BuildCommentLineScanner();
			commentLineScanner.CommentLineNode.Entities.Add("#");
			commentLineScanner.Child = stringScanner;

			IScanner commentBlockScanner = this.BuildCommentBlockScanner();
			commentBlockScanner.Child = commentLineScanner;

			PHPScanner phpScanner = new PHPScanner(this.Tokenizer, this.ScannerResult);
			phpScanner.Child = commentBlockScanner;

			return phpScanner;
		}

		/// <summary>
		/// Builds a word scanner.
		/// </summary>
		/// <returns>A <see cref="Wilco.SyntaxHighlighting.WordScanner"/> object.</returns>
		protected override IScanner BuildWordScanner()
		{
			WordScanner scanner = new WordScanner(this.Tokenizer, this.ScannerResult);
			scanner.WordNodes = new WordNode[2];
			scanner.WordNodes[0] = new WordNode();
			scanner.WordNodes[0].ForeColor = Color.Blue;
			scanner.WordNodes[0].Entities.AddRange(this.GetKeywords());
			scanner.WordNodes[0].NavigateUrl = "http://www.php.net/{0}";
			scanner.WordNodes[1] = new WordNode();
			scanner.WordNodes[1].ForeColor = Color.Orange;
			scanner.WordNodes[1].Entities.AddRange(this.GetFunctions());
			scanner.WordNodes[1].NavigateUrl = "http://www.php.net/{0}";
			scanner.WordNodes[1].IgnoreCase = true;
			return scanner;
		}

		/// <summary>
		/// Gets an array of registered keywords.
		/// </summary>
		/// <returns>An array of keywords.</returns>
		private string[] GetKeywords()
		{
			string[] keywordList = new string[]
			{
				"as", "break", "case", "continue", "declare", "default", "do", "echo", "else", "elseif", "endif", "endfor", "endswitch", "endwhile", "exit", "for", "foreach", "function", "global", "if", "include", "include_once", "next", "return", "require", "require_once", "switch", "while", "die", "class", "var", "true", "false", "extends"
			};

			Array.Sort(keywordList);
			Array.Reverse(keywordList);

			return keywordList;
		}

		/// <summary>
		/// Gets an array of registered functions.
		/// </summary>
		/// <returns>An array of functions.</returns>
		private string[] GetFunctions()
		{
			string[] functionList = new string[]
			{
				"abs", "accept_connect", "acos", "add_iovec", "addcslashes", "addslashes", "apache_lookup_uri", "apache_note", "apache_sub_req", "array", "array_count_values", "array_diff", "array_flip", "array_intersect", "array_keys", "array_merge", "array_merge_recursive", "array_multisort",
				"array_pad", "array_pop", "array_push", "array_rand", "array_reverse", "array_shift", "array_slice", "array_splice", "array_sum", "array_unique", "array_unshift", "array_values", "array_walk", "arsort", "asin", "asort", "aspell_check", "aspell_check_raw", "aspell_new", "aspell_suggest",
				"assert", "assert_options", "atan", "atan2", "base64_decode", "base64_encode", "base_convert", "basename", "bcadd", "bccomp", "bcdiv", "bcmod", "bcmul", "bcpow", "bcscale", "bcsqrt", "bcsub", "bin2hex", "bind", "bindec", "bindtextdomain", "build_iovec", "bzclose", "bzcompress", "bzdecompress", "bzerrno", "bzerror", "bzerrstr", "bzflush", "bzopen", "bzread", "bzwrite", "call_user_func", "call_user_func_array", "call_user_method", "ccvs_add", "ccvs_auth", "ccvs_command", "ccvs_count", "ccvs_delete", "ccvs_done", "ccvs_init", "ccvs_lookup", "ccvs_new", "ccvs_report", "ccvs_return",
				"ccvs_reverse", "ccvs_sale", "ccvs_status", "ccvs_textvalue", "ccvs_void", "ceil", "chdir", "checkdate", "checkdnsrr", "chgrp", "chmod", "chop", "chown", "chr", "chunk_split", "class_exists", "clearstatcache", "close", "closedir", "closelog", "com_get", "com_invoke", "com_load", "com_propget", "com_propput", "com_propset", "com_set", "confirm_ctype_compiled", "confirm_extname_compiled", "confirm_zziplib_compiled", "connect", "connection_aborted", "connection_status", "connection_timeout", "constant", "convert_cyr_string", "copy", "cos", "count", "count_chars", "cpdf_add_annotation", "cpdf_add_outline", "cpdf_arc",
				"cpdf_begin_text", "cpdf_circle", "cpdf_clip", "cpdf_close", "cpdf_closepath", "cpdf_closepath_fill_stroke", "cpdf_closepath_stroke", "cpdf_continue_text", "cpdf_curveto", "cpdf_end_text", "cpdf_fill", "cpdf_fill_stroke", "cpdf_finalize", "cpdf_finalize_page", "cpdf_global_set_document_limits", "cpdf_import_jpeg", "cpdf_lineto", "cpdf_moveto", "cpdf_newpath", "cpdf_open", "cpdf_output_buffer", "cpdf_page_init", "cpdf_place_inline_image", "cpdf_rect", "cpdf_restore", "cpdf_rlineto", "cpdf_rmoveto", "cpdf_rotate", "cpdf_rotate_text", "cpdf_save", "cpdf_save_to_file", "cpdf_scale", "cpdf_set_action_url", "cpdf_set_char_spacing", "cpdf_set_creator",
				"cpdf_set_current_page", "cpdf_set_font", "cpdf_set_horiz_scaling", "cpdf_set_keywords", "cpdf_set_leading", "cpdf_set_page_animation", "cpdf_set_subject", "cpdf_set_text_matrix", "cpdf_set_text_pos", "cpdf_set_text_rendering", "cpdf_set_text_rise", "cpdf_set_title", "cpdf_set_viewer_preferences", "cpdf_set_word_spacing", "cpdf_setdash", "cpdf_setflat", "cpdf_setgray", "cpdf_setgray_fill", "cpdf_setgray_stroke", "cpdf_setlinecap", "cpdf_setlinejoin", "cpdf_setlinewidth", "cpdf_setmiterlimit", "cpdf_setrgbcolor", "cpdf_setrgbcolor_fill", "cpdf_setrgbcolor_stroke", "cpdf_show", "cpdf_show_xy", "cpdf_stringwidth", "cpdf_stroke", "cpdf_text", "cpdf_translate", "crash", "crc32", "create_function", "crypt", "curl_close", "curl_errno", "curl_error", "curl_exec", "curl_getinfo", "curl_init", "curl_setopt", "curl_version", "current",
				"cv_add", "cv_auth", "cv_command", "cv_count", "cv_delete", "cv_done", "cv_init", "cv_lookup", "cv_new", "cv_report", "cv_return", "cv_reverse", "cv_sale", "cv_status", "cv_textvalue", "cv_void", "cybercash_base64_decode", "cybercash_base64_encode", "cybercash_decr", "cybercash_encr", "date", "dav_set_mkcol_handlers", "dba_close", "dba_delete", "dba_exists", "dba_fetch", "dba_firstkey", "dba_insert", "dba_nextkey", "dba_open", "dba_optimize", "dba_popen", "dba_replace", "dba_sync", "dbase_add_record", "dbase_close", "dbase_create", "dbase_delete_record", "dbase_get_record", "dbase_get_record_with_names", "dbase_numfields", "dbase_numrecords", "dbase_open", "dbase_pack", "dbase_replace_record", "dblist", "dbmclose", "dbmdelete", "dbmexists", "dbmfetch", "dbmfirstkey", "dbminsert", "dbmnextkey", "dbmopen", "dbmreplace", "dcgettext", "decbin", "dechex", "decoct", "define", "define_syslog_variables", "defined", "deg2rad", "delete_iovec", "dgettext", "dir", "dirname", "diskfreespace", "display_disabled_function", "dl", "domxml_add_root", "domxml_attributes", "domxml_children", "domxml_dumpmem", "domxml_getattr", "domxml_new_child", "domxml_new_xmldoc", "domxml_node", "domxml_root", "domxml_set_content", "domxml_setattr", "doubleval", "each", "easter_date", "easter_days", "end", "ereg", "ereg_replace", "eregi", "eregi_replace", "error_log", "error_reporting", "escapeshellarg", "escapeshellcmd", "exec", "exp", "explode", "extension_loaded", "extract", "ezmlm_hash", "exit", "fclose", "fd_alloc", "fd_clear", "fd_dealloc", "fd_isset", "fd_set", "fd_zero", "fdf_add_template", "fdf_close", "fdf_create", "fdf_get_file", "fdf_get_status", "fdf_get_value", "fdf_next_field_name", "fdf_open", "fdf_save", "fdf_set_ap", "fdf_set_file", "fdf_set_flags", "fdf_set_javascript_action", "fdf_set_opt", "fdf_set_status", "fdf_set_submit_form_action", "fdf_set_value", "feof", "fetch_iovec", "fflush", "fgetc",
				"fgetcsv", "fgets", "fgetss", "file", "file_exists", "fileatime", "filectime", "filegroup", "fileinode", "filemtime", "fileowner", "fileperms", "filepro", "filepro_fieldcount", "filepro_fieldname", "filepro_fieldtype", "filepro_fieldwidth", "filepro_retrieve", "filepro_rowcount", "filesize", "filetype", "flock", "floor", "flush", "fopen", "fpassthru", "fputs", "fread", "free_iovec", "frenchtojd", "fribidi_log2vis", "fscanf", "fseek", "fsockopen", "fstat", "ftell", "ftp_cdup", "ftp_chdir", "ftp_connect", "ftp_delete", "ftp_exec", "ftp_fget", "ftp_fput", "ftp_get", "ftp_login", "ftp_mdtm", "ftp_mkdir", "ftp_nlist", "ftp_pasv", "ftp_put", "ftp_pwd", "ftp_quit", "ftp_rawlist", "ftp_rename", "ftp_rmdir", "ftp_site", "ftp_size", "ftp_systype", "ftruncate", "func_get_arg", "func_get_args", "func_num_args", "function_exists", "fwrite", "get_all_headers", "get_browser", "get_cfg_var", "get_class", "get_class_methods", "get_class_vars", "get_current_user", "get_declared_classes", "get_defined_functions", "get_defined_vars", "get_extension_funcs", "get_html_translation_table", "get_included_files", "get_loaded_extensions", "get_magic_quotes_gpc", "get_magic_quotes_runtime", "get_meta_tags", "get_object_vars", "get_parent_class", "get_resource_type", "getallheaders", "getcwd", "getdate", "getenv", "gethostbyaddr", "gethostbyname", "gethostbynamel", "getimagesize", "getlastmod", "getmxrr", "getmyinode", "getmypid", "getmyuid", "getpeername", "getprotobyname", "getprotobynumber", "getrandmax", "getrusage", "getservbyname", "getservbyport", "getsockname", "getsockopt", "gettext", "gettimeofday", "gettype", "gmdate", "gmmktime", "gmp_abs", "gmp_add", "gmp_and", "gmp_clrbit", "gmp_cmp", "gmp_com", "gmp_div_q", "gmp_div_qr", "gmp_div_r", "gmp_divexact", "gmp_fact", "gmp_gcd", "gmp_gcdext", "gmp_hamdist", "gmp_init", "gmp_intval", "gmp_invert", "gmp_jacobi", "gmp_legendre", "gmp_mod", "gmp_mul", "gmp_neg",
				"gmp_or", "gmp_perfect_square", "gmp_popcount", "gmp_pow", "gmp_powm", "gmp_prob_prime", "gmp_random", "gmp_scan0", "gmp_scan1", "gmp_setbit", "gmp_sign", "gmp_sqrt", "gmp_sqrtrem", "gmp_strval", "gmp_sub", "gmp_xor", "gmstrftime", "gregoriantojd", "gzclose", "gzcompress", "gzdeflate", "gzencode", "gzeof", "gzfile", "gzgetc", "gzgets", "gzgetss", "gzinflate", "gzopen", "gzpassthru", "gzputs", "gzread", "gzrewind", "gzseek", "gztell", "gzuncompress", "gzwrite", "header", "headers_sent", "hebrev", "hebrevc", "hexdec", "highlight_file", "highlight_string", "htmlentities", "htmlspecialchars", "hw_array2objrec", "hw_changeobject", "hw_children", "hw_childrenobj", "hw_close", "hw_connect", "hw_connection_info", "hw_cp", "hw_deleteobject", "hw_docbyanchor", "hw_docbyanchorobj", "hw_document_attributes", "hw_document_bodytag", "hw_document_content", "hw_document_setcontent", "hw_document_size", "hw_dummy", "hw_edittext", "hw_error", "hw_errormsg", "hw_free_document", "hw_getanchors", "hw_getanchorsobj", "hw_getandlock", "hw_getcgi", "hw_getchildcoll", "hw_getchildcollobj", "hw_getchilddoccoll", "hw_getchilddoccollobj", "hw_getobject", "hw_getobjectbyftquery", "hw_getobjectbyftquerycoll", "hw_getobjectbyftquerycollobj", "hw_getobjectbyftqueryobj", "hw_getobjectbyquery", "hw_getobjectbyquerycoll", "hw_getobjectbyquerycollobj", "hw_getobjectbyqueryobj", "hw_getparents", "hw_getparentsobj", "hw_getrellink", "hw_getremote", "hw_getremotechildren", "hw_getsrcbydestobj", "hw_gettext", "hw_getusername", "hw_identify", "hw_incollections", "hw_info", "hw_inscoll", "hw_insdoc", "hw_insertanchors", "hw_insertdocument", "hw_insertobject", "hw_mapid", "hw_modifyobject", "hw_mv", "hw_new_document", "hw_objrec2array", "hw_output_document", "hw_pconnect", "hw_pipecgi", "hw_pipedocument", "hw_root", "hw_setlinkroot", "hw_stat", "hw_unlock", "hw_who", "ibase_blob_add", "ibase_blob_cancel", "ibase_blob_close", "ibase_blob_create", "ibase_blob_echo", "ibase_blob_get", "ibase_blob_import", "ibase_blob_info", "ibase_blob_open",
				"ibase_close", "ibase_commit", "ibase_connect", "ibase_errmsg", "ibase_execute", "ibase_fetch_object", "ibase_fetch_row", "ibase_field_info", "ibase_free_query", "ibase_free_result", "ibase_num_fields", "ibase_pconnect", "ibase_prepare", "ibase_query", "ibase_rollback", "ibase_timefmt", "ibase_trans", "icap_create_calendar", "icap_delete_calendar", "icap_delete_event", "icap_fetch_event", "icap_list_alarms", "icap_list_events", "icap_open", "icap_popen", "icap_rename_calendar", "icap_reopen", "icap_snooze", "icap_store_event", "ifx_affected_rows", "ifx_blobinfile_mode", "ifx_byteasvarchar", "ifx_close", "ifx_connect", "ifx_copy_blob", "ifx_create_blob", "ifx_create_char", "ifx_do", "ifx_error", "ifx_errormsg", "ifx_fetch_row", "ifx_fieldproperties", "ifx_fieldtypes", "ifx_free_blob", "ifx_free_char", "ifx_free_result", "ifx_get_blob", "ifx_get_char", "ifx_getsqlca", "ifx_htmltbl_result", "ifx_nullformat", "ifx_num_fields", "ifx_num_rows", "ifx_pconnect", "ifx_prepare", "ifx_query", "ifx_textasvarchar", "ifx_update_blob", "ifx_update_char", "ifxus_close_slob", "ifxus_create_slob", "ifxus_free_slob", "ifxus_open_slob", "ifxus_read_slob", "ifxus_seek_slob", "ifxus_tell_slob", "ifxus_write_slob", "ignore_user_abort", "iis_addserver", "iis_getdirsecurity", "iis_getscriptmap", "iis_getserverbycomment", "iis_getserverbypath", "iis_getserverright", "iis_getservicestate", "iis_removeserver", "iis_setappsettings", "iis_setdirsecurity", "iis_setscriptmap", "iis_setserverright", "iis_startserver", "iis_startservice", "iis_stopserver", "iis_stopservice", "imagearc", "imagechar", "imagecharup", "imagecolorallocate", "imagecolorat", "imagecolorclosest", "imagecolorclosesthwb", "imagecolordeallocate", "imagecolorexact", "imagecolorresolve", "imagecolorset", "imagecolorsforindex", "imagecolorstotal", "imagecolortransparent", "imagecopy", "imagecopymerge", "imagecopyresized", "imagecreate", "imagecreatefromgif", "imagecreatefromjpeg", "imagecreatefrompng", "imagecreatefromstring", "imagecreatefromwbmp",
				"imagecreatefromxbm",
				"imagecreatefromxpm", "imagedashedline", "imagedestroy", "imagefill", "imagefilledpolygon", "imagefilledrectangle", "imagefilltoborder", "imagefontheight", "imagefontwidth", "imagegammacorrect", "imagegif", "imageinterlace", "imagejpeg", "imageline", "imageloadfont", "imagepalettecopy", "imagepng", "imagepolygon", "imagepsbbox", "imagepscopyfont", "imagepsencodefont", "imagepsextendfont", "imagepsfreefont", "imagepsloadfont", "imagepsslantfont", "imagepstext", "imagerectangle", "imagesetpixel", "imagestring", "imagestringup", "imagesx", "imagesy", "imagettfbbox", "imagettftext", "imagetypes", "imagewbmp", "imap_8bit", "imap_alerts", "imap_append", "imap_base64", "imap_binary", "imap_body", "imap_bodystruct", "imap_check", "imap_clearflag_full", "imap_close", "imap_create", "imap_createmailbox", "imap_delete", "imap_deletemailbox", "imap_errors", "imap_expunge", "imap_fetch_overview", "imap_fetchbody", "imap_fetchheader", "imap_fetchstructure", "imap_fetchtext", "imap_getmailboxes", "imap_getsubscribed", "imap_header", "imap_headerinfo", "imap_headers", "imap_last_error", "imap_list", "imap_listmailbox", "imap_listsubscribed", "imap_lsub", "imap_mail", "imap_mail_compose", "imap_mail_copy", "imap_mail_move", "imap_mailboxmsginfo", "imap_mime_header_decode", "imap_msgno", "imap_num_msg", "imap_num_recent", "imap_open", "imap_ping", "imap_popen", "imap_qprint", "imap_rename", "imap_renamemailbox", "imap_reopen", "imap_rfc822_parse_adrlist", "imap_rfc822_parse_headers", "imap_rfc822_write_address", "imap_scan", "imap_scanmailbox", "imap_search", "imap_setflag_full", "imap_sort", "imap_status", "imap_subscribe", "imap_uid", "imap_undelete", "imap_unsubscribe", "imap_utf7_decode", "imap_utf7_encode", "imap_utf8", "implode", "in_array", "ingres_autocommit", "ingres_close", "ingres_commit", "ingres_connect", "ingres_fetch_array", "ingres_fetch_object", "ingres_fetch_row", "ingres_field_length", "ingres_field_name", "ingres_field_nullable", "ingres_field_precision", "ingres_field_scale", "ingres_field_type",
				"ingres_num_fields", "ingres_num_rows", "ingres_pconnect", "ingres_query", "ingres_rollback", "ini_alter", "ini_get", "ini_restore", "ini_set", "intval", "ip2long", "iptcembed", "iptcparse", "ircg_disconnect", "ircg_join", "ircg_msg", "ircg_part", "ircg_pconnect", "ircg_set_current", "is_array", "is_bool", "is_dir", "is_double", "is_executable", "is_file", "is_float", "is_int", "is_integer", "is_link", "is_long", "is_null", "is_numeric", "is_object", "is_readable", "is_real", "is_resource", "is_string", "is_subclass_of", "is_uploaded_file", "is_writable", "is_writeable", "isalnum", "isalpha", "iscntrl", "isdigit", "isgraph", "islower", "isprint", "ispunct", "isspace", "isupper", "isxdigit", "java_last_exception_clear", "java_last_exception_get", "jddayofweek", "jdmonthname", "jdtofrench", "jdtogregorian", "jdtojewish", "jdtojulian", "jdtounix", "jewishtojd", "join", "juliantojd", "key", "krsort", "ksort", "lcg_value", "ldap_8859_to_t61", "ldap_add", "ldap_bind", "ldap_close", "ldap_compare", "ldap_connect", "ldap_count_entries", "ldap_delete", "ldap_dn2ufn", "ldap_err2str", "ldap_errno", "ldap_error", "ldap_explode_dn", "ldap_first_attribute", "ldap_first_entry", "ldap_free_result", "ldap_get_attributes", "ldap_get_dn", "ldap_get_entries", "ldap_get_option", "ldap_get_values", "ldap_get_values_len", "ldap_list", "ldap_mod_add", "ldap_mod_del", "ldap_mod_replace", "ldap_modify", "ldap_next_attribute", "ldap_next_entry", "ldap_read", "ldap_search", "ldap_set_option", "ldap_t61_to_8859", "ldap_unbind", "leak", "levenshtein", "link", "linkinfo", "list", "listen", "localtime", "log", "log10", "long2ip", "lstat", "ltrim", "magic_quotes_runtime", "mail", "max", "mcal_append_event", "mcal_close", "mcal_create_calendar", "mcal_date_compare", "mcal_date_valid", "mcal_day_of_week", "mcal_day_of_year", "mcal_days_in_month", "mcal_delete_calendar", "mcal_delete_event", "mcal_event_add_attribute", "mcal_event_init", "mcal_event_set_alarm", "mcal_event_set_category", "mcal_event_set_class", "mcal_event_set_description",
				"mcal_event_set_end", "mcal_event_set_recur_daily", "mcal_event_set_recur_monthly_mday", "mcal_event_set_recur_monthly_wday", "mcal_event_set_recur_none", "mcal_event_set_recur_weekly", "mcal_event_set_recur_yearly", "mcal_event_set_start", "mcal_event_set_title", "mcal_fetch_current_stream_event", "mcal_fetch_event", "mcal_is_leap_year", "mcal_list_alarms", "mcal_list_events", "mcal_next_recurrence", "mcal_open", "mcal_popen", "mcal_rename_calendar", "mcal_reopen", "mcal_snooze", "mcal_store_event", "mcal_time_valid", "mcal_week_of_year", "mcrypt_cbc", "mcrypt_cfb", "mcrypt_create_iv", "mcrypt_decrypt", "mcrypt_ecb", "mcrypt_enc_get_algorithms_name", "mcrypt_enc_get_block_size", "mcrypt_enc_get_iv_size", "mcrypt_enc_get_key_size", "mcrypt_enc_get_modes_name", "mcrypt_enc_get_supported_key_sizes", "mcrypt_enc_is_block_algorithm", "mcrypt_enc_is_block_algorithm_mode", "mcrypt_enc_is_block_mode", "mcrypt_enc_self_test", "mcrypt_encrypt", "mcrypt_generic", "mcrypt_generic_end", "mcrypt_generic_init", "mcrypt_get_block_size", "mcrypt_get_cipher_name", "mcrypt_get_iv_size", "mcrypt_get_key_size", "mcrypt_list_algorithms", "mcrypt_list_modes", "mcrypt_module_close", "mcrypt_module_get_algo_block_size", "mcrypt_module_get_algo_key_size", "mcrypt_module_get_supported_key_sizes", "mcrypt_module_is_block_algorithm", "mcrypt_module_is_block_algorithm_mode", "mcrypt_module_is_block_mode", "mcrypt_module_open", "mcrypt_module_self_test", "mcrypt_ofb", "md5", "mdecrypt_generic", "metaphone", "method_exists", "mhash", "mhash_count", "mhash_get_block_size", "mhash_get_hash_name", "mhash_keygen_s2k", "microtime", "min", "mkdir", "mktime", "move_uploaded_file", "msql", "msql_affected_rows", "msql_close", "msql_connect", "msql_create_db", "msql_createdb", "msql_data_seek", "msql_db_query", "msql_dbname", "msql_drop_db", "msql_dropdb", "msql_error", "msql_fetch_array", "msql_fetch_field", "msql_fetch_object", "msql_fetch_row", "msql_field_flags", "msql_field_len", "msql_field_name", "msql_field_seek", "msql_field_table",
				"msql_field_type", "msql_fieldflags", "msql_fieldlen", "msql_fieldname", "msql_fieldtable", "msql_fieldtype", "msql_free_result", "msql_freeresult", "msql_list_dbs", "msql_list_fields", "msql_list_tables", "msql_listdbs", "msql_listfields", "msql_listtables", "msql_num_fields", "msql_num_rows", "msql_numfields", "msql_numrows", "msql_pconnect", "msql_query", "msql_regcase", "msql_result", "msql_select_db", "msql_selectdb", "msql_tablename", "mssql_affected_rows", "mssql_close", "mssql_connect", "mssql_data_seek", "mssql_fetch_array", "mssql_fetch_batch", "mssql_fetch_field", "mssql_fetch_object", "mssql_fetch_row", "mssql_field_length", "mssql_field_name", "mssql_field_seek", "mssql_field_type", "mssql_free_result", "mssql_get_last_message", "mssql_min_client_severity", "mssql_min_error_severity", "mssql_min_message_severity", "mssql_min_server_severity", "mssql_num_fields", "mssql_num_rows", "mssql_pconnect", "mssql_query", "mssql_result", "mssql_rows_affected", "mssql_select_db", "mt_getrandmax", "mt_rand", "mt_srand", "mysql", "mysql_affected_rows", "mysql_close", "mysql_connect", "mysql_create_db", "mysql_createdb", "mysql_data_seek", "mysql_db_name", "mysql_db_query", "mysql_dbname", "mysql_drop_db", "mysql_dropdb", "mysql_errno", "mysql_error", "mysql_escape_string", "mysql_fetch_array", "mysql_fetch_assoc", "mysql_fetch_field", "mysql_fetch_lengths", "mysql_fetch_object", "mysql_fetch_row", "mysql_field_flags", "mysql_field_len", "mysql_field_name", "mysql_field_seek", "mysql_field_table", "mysql_field_type", "mysql_fieldflags", "mysql_fieldlen", "mysql_fieldname", "mysql_fieldtable", "mysql_fieldtype", "mysql_free_result", "mysql_freeresult", "mysql_insert_id", "mysql_list_dbs", "mysql_list_fields", "mysql_list_tables", "mysql_listdbs", "mysql_listfields", "mysql_listtables", "mysql_num_fields", "mysql_num_rows", "mysql_numfields", "mysql_numrows", "mysql_pconnect", "mysql_query", "mysql_result", "mysql_select_db", "mysql_selectdb", "mysql_tablename", "natcasesort", "natsort", "new_xmldoc",
				"nl2br", "number_format", "ob_end_clean", "ob_end_flush", "ob_get_contents", "ob_get_length", "ob_gzhandler", "ob_implicit_flush", "ob_start", "ocibindbyname", "ocicancel", "ocicolumnisnull", "ocicolumnname", "ocicolumnprecision", "ocicolumnscale", "ocicolumnsize", "ocicolumntype", "ocicolumntyperaw", "ocicommit", "ocidefinebyname", "ocierror", "ociexecute", "ocifetch", "ocifetchinto", "ocifetchstatement", "ocifreecursor", "ocifreedesc", "ocifreestatement", "ociinternaldebug", "ociloadlob", "ocilogoff", "ocilogon", "ocinewcursor", "ocinewdescriptor", "ocinlogon", "ocinumcols", "ociparse", "ociplogon", "ociresult", "ocirollback", "ocirowcount", "ocisavelob", "ocisavelobfile", "ociserverversion", "ocisetprefetch", "ocistatementtype", "ociwritelobtofile", "octdec", "odbc_autocommit", "odbc_binmode", "odbc_close", "odbc_close_all", "odbc_columnprivileges", "odbc_columns", "odbc_commit", "odbc_connect", "odbc_cursor", "odbc_do", "odbc_exec", "odbc_execute", "odbc_fetch_array", "odbc_fetch_into", "odbc_fetch_object", "odbc_fetch_row", "odbc_field_len", "odbc_field_name", "odbc_field_num", "odbc_field_precision", "odbc_field_scale", "odbc_field_type", "odbc_foreignkeys", "odbc_free_result", "odbc_gettypeinfo", "odbc_longreadlen", "odbc_num_fields", "odbc_num_rows", "odbc_pconnect", "odbc_prepare", "odbc_primarykeys", "odbc_procedurecolumns", "odbc_procedures", "odbc_result", "odbc_result_all", "odbc_rollback", "odbc_setoption", "odbc_specialcolumns", "odbc_statistics", "odbc_tableprivileges", "odbc_tables", "open_listen_sock", "opendir", "openlog", "openssl_free_key", "openssl_free_x509", "openssl_get_privatekey", "openssl_get_publickey", "openssl_open", "openssl_read_publickey", "openssl_read_x509", "openssl_seal", "openssl_sign", "openssl_verify", "ora_bind", "ora_close", "ora_columnname", "ora_columnsize", "ora_columntype", "ora_commit", "ora_commitoff", "ora_commiton", "ora_do", "ora_error", "ora_errorcode", "ora_exec", "ora_fetch", "ora_fetch_into", "ora_getcolumn", "ora_logoff", "ora_logon",
				"ora_numcols", "ora_numrows", "ora_open", "ora_parse", "ora_plogon", "ora_rollback", "orbit_caught_exception", "orbit_exception_id", "orbit_exception_value", "orbit_get_repository_id", "orbit_load_idl", "ord", "ovrimos_close", "ovrimos_close_all", "ovrimos_commit", "ovrimos_connect", "ovrimos_cursor", "ovrimos_exec", "ovrimos_execute", "ovrimos_fetch_into", "ovrimos_fetch_row", "ovrimos_field_len", "ovrimos_field_name", "ovrimos_field_num", "ovrimos_field_type", "ovrimos_free_result", "ovrimos_longreadlen", "ovrimos_num_fields", "ovrimos_num_rows", "ovrimos_prepare", "ovrimos_result", "ovrimos_result_all", "ovrimos_rollback", "pack", "parse_ini_file", "parse_str", "parse_url", "passthru", "pathinfo", "pclose", "pdf_add_annotation", "pdf_add_bookmark", "pdf_add_outline", "pdf_add_pdflink", "pdf_add_weblink", "pdf_arc", "pdf_begin_page", "pdf_circle", "pdf_clip", "pdf_close", "pdf_close_image", "pdf_closepath", "pdf_closepath_fill_stroke", "pdf_closepath_stroke", "pdf_continue_text", "pdf_curveto", "pdf_end_page", "pdf_endpath", "pdf_fill", "pdf_fill_stroke", "pdf_get_font", "pdf_get_fontname", "pdf_get_fontsize", "pdf_get_image_height", "pdf_get_image_width", "pdf_get_parameter", "pdf_get_value", "pdf_lineto", "pdf_moveto", "pdf_open", "pdf_open_gif", "pdf_open_image_file", "pdf_open_jpeg", "pdf_open_memory_image", "pdf_open_png", "pdf_open_tiff", "pdf_place_image", "pdf_rect", "pdf_restore", "pdf_rotate", "pdf_save", "pdf_scale", "pdf_set_border_color", "pdf_set_border_dash", "pdf_set_border_style", "pdf_set_char_spacing", "pdf_set_duration", "pdf_set_font", "pdf_set_horiz_scaling", "pdf_set_info", "pdf_set_info_author", "pdf_set_info_creator", "pdf_set_info_keywords", "pdf_set_info_subject", "pdf_set_info_title", "pdf_set_leading", "pdf_set_parameter", "pdf_set_text_pos", "pdf_set_text_rendering", "pdf_set_text_rise", "pdf_set_transition", "pdf_set_value", "pdf_set_word_spacing", "pdf_setdash", "pdf_setflat", "pdf_setgray", "pdf_setgray_fill", "pdf_setgray_stroke", "pdf_setlinecap",
				"pdf_setlinejoin", "pdf_setlinewidth", "pdf_setmiterlimit", "pdf_setrgbcolor", "pdf_setrgbcolor_fill", "pdf_setrgbcolor_stroke", "pdf_show", "pdf_show_boxed", "pdf_show_xy", "pdf_skew", "pdf_stringwidth", "pdf_stroke", "pdf_translate", "pfpro_cleanup", "pfpro_init", "pfpro_process", "pfpro_process_raw", "pfpro_version", "pfsockopen", "pg_client_encoding", "pg_clientencoding", "pg_close", "pg_cmdtuples", "pg_connect", "pg_dbname", "pg_end_copy", "pg_errormessage", "pg_exec", "pg_fetch_array", "pg_fetch_object", "pg_fetch_row", "pg_fieldisnull", "pg_fieldname", "pg_fieldnum", "pg_fieldprtlen", "pg_fieldsize", "pg_fieldtype", "pg_freeresult", "pg_getlastoid", "pg_host", "pg_loclose", "pg_locreate", "pg_loexport", "pg_loimport", "pg_loopen", "pg_loread", "pg_loreadall", "pg_lounlink", "pg_lowrite", "pg_numfields", "pg_numrows", "pg_options", "pg_pconnect", "pg_port", "pg_put_line", "pg_result", "pg_set_client_encoding", "pg_setclientencoding", "pg_trace", "pg_tty", "pg_untrace", "php_logo_guid", "php_sapi_name", "php_uname", "phpcredits", "phpinfo", "phpversion", "pi", "popen", "pos", "posix_ctermid", "posix_getcwd", "posix_getegid", "posix_geteuid", "posix_getgid", "posix_getgrgid", "posix_getgrnam", "posix_getgroups", "posix_getlogin", "posix_getpgid", "posix_getpgrp", "posix_getpid", "posix_getppid", "posix_getpwnam", "posix_getpwuid", "posix_getrlimit", "posix_getsid", "posix_getuid", "posix_isatty", "posix_kill", "posix_mkfifo", "posix_setegid", "posix_seteuid", "posix_setgid", "posix_setpgid", "posix_setsid", "posix_setuid", "posix_times", "posix_ttyname", "posix_uname", "pow", "preg_grep", "preg_match", "preg_match_all", "preg_quote", "preg_replace", "preg_split", "prev", "print", "print_r", "printer_close", "printer_create_brush", "printer_create_dc", "printer_create_font", "printer_create_pen", "printer_delete_brush", "printer_delete_dc", "printer_delete_font", "printer_delete_pen", "printer_draw_elipse", "printer_draw_rectangle", "printer_draw_roundrect", "printer_draw_text",
				"printer_end_doc", "printer_end_page", "printer_get_option", "printer_list", "printer_logical_fontheight", "printer_name", "printer_open", "printer_select_brush", "printer_select_font", "printer_select_pen", "printer_set_option", "printer_start_doc", "printer_start_page", "printer_write", "printf", "pspell_add_to_personal", "pspell_add_to_session", "pspell_check", "pspell_clear_session", "pspell_config_create", "pspell_config_ignore", "pspell_config_mode", "pspell_config_personal", "pspell_config_repl", "pspell_config_runtogether", "pspell_config_save_repl", "pspell_new", "pspell_new_config", "pspell_new_personal", "pspell_save_wordlist", "pspell_store_replacement", "pspell_suggest", "putenv", "qdom_tree", "quoted_printable_decode", "quotemeta", "rad2deg", "rand", "range", "rawurldecode", "rawurlencode", "read", "read_exif_data", "readdir", "readfile", "readgzfile", "readline", "readline_add_history", "readline_clear_history", "readline_completion_function", "readline_info", "readline_list_history", "readline_read_history", "readline_write_history", "readlink", "readv", "realpath", "recode", "recode_file", "recode_string", "recv", "recvfrom", "recvmsg", "register_shutdown_function", "register_tick_function", "rename", "reset", "restore_error_handler", "rewind", "rewinddir", "rmdir", "round", "rsort", "rtrim", "satellite_caught_exception", "satellite_exception_id", "satellite_exception_value", "satellite_get_repository_id", "satellite_load_idl", "select", "sem_acquire", "sem_get", "sem_release", "send", "sendmsg", "sendto", "serialize", "session_cache_limiter", "session_decode", "session_destroy", "session_encode", "session_get_cookie_params", "session_id", "session_is_registered", "session_module_name", "session_name", "session_register", "session_save_path", "session_set_cookie_params", "session_set_save_handler", "session_start", "session_unregister", "session_unset", "session_write_close", "set_error_handler", "set_file_buffer", "set_iovec", "set_magic_quotes_runtime",
				"set_nonblock", "set_socket_blocking", "set_time_limit", "setcookie", "setlocale", "setsockopt", "settype", "shell_exec", "shm_attach", "shm_detach", "shm_get_var", "shm_put_var", "shm_remove", "shm_remove_var", "shmop_close", "shmop_delete", "shmop_open", "shmop_read", "shmop_size", "shmop_write", "show_source", "shuffle", "shutdown", "signal", "similar_text", "sin", "sizeof", "sleep", "snmp_get_quick_print", "snmp_set_quick_print", "snmpget", "snmprealwalk", "snmpset", "snmpwalk", "snmpwalkoid", "socket", "socket_get_status", "socket_set_blocking", "socket_set_timeout", "socketpair", "sort", "soundex", "split", "spliti", "sprintf", "sql_regcase", "sqrt", "srand", "sscanf", "stat", "str_pad", "str_repeat", "str_replace", "strcasecmp", "strchr", "strcmp", "strcspn", "strerror", "strftime", "strip_tags", "stripcslashes", "stripslashes", "stristr", "strlen", "strnatcasecmp", "strnatcmp", "strncasecmp", "strncmp", "strpos", "strrchr", "strrev", "strrpos", "strspn", "strstr", "strtok", "strtolower", "strtotime", "strtoupper", "strtr", "strval", "substr", "substr_count", "substr_replace", "swf_actiongeturl", "swf_actiongotoframe", "swf_actiongotolabel", "swf_actionnextframe", "swf_actionplay", "swf_actionprevframe", "swf_actionsettarget", "swf_actionstop", "swf_actiontogglequality", "swf_actionwaitforframe", "swf_addbuttonrecord", "swf_addcolor", "swf_closefile", "swf_definebitmap", "swf_definefont", "swf_defineline", "swf_definepoly", "swf_definerect", "swf_definetext", "swf_endbutton", "swf_enddoaction", "swf_endshape", "swf_endsymbol", "swf_fontsize", "swf_fontslant", "swf_fonttracking", "swf_getbitmapinfo", "swf_getfontinfo", "swf_getframe", "swf_labelframe", "swf_lookat", "swf_modifyobject", "swf_mulcolor", "swf_nextid", "swf_oncondition", "swf_openfile", "swf_ortho", "swf_ortho2", "swf_perspective", "swf_placeobject", "swf_polarview", "swf_popmatrix", "swf_posround", "swf_pushmatrix", "swf_removeobject", "swf_rotate", "swf_scale", "swf_setfont",
				"swf_setframe", "swf_shapearc", "swf_shapecurveto", "swf_shapecurveto3", "swf_shapefillbitmapclip", "swf_shapefillbitmaptile", "swf_shapefilloff", "swf_shapefillsolid", "swf_shapelinesolid", "swf_shapelineto", "swf_shapemoveto", "swf_showframe", "swf_startbutton", "swf_startdoaction", "swf_startshape", "swf_startsymbol", "swf_textwidth", "swf_translate", "swf_viewport", "sybase_affected_rows", "sybase_close", "sybase_connect", "sybase_data_seek", "sybase_fetch_array", "sybase_fetch_field", "sybase_fetch_object", "sybase_fetch_row", "sybase_field_seek", "sybase_free_result", "sybase_get_last_message", "sybase_min_client_severity", "sybase_min_error_severity", "sybase_min_message_severity", "sybase_min_server_severity", "sybase_num_fields", "sybase_num_rows", "sybase_pconnect", "sybase_query", "sybase_result", "sybase_select_db", "symlink", "syslog", "system", "tan", "tempnam", "textdomain", "time", "tmpfile", "touch", "trigger_error", "trim", "uasort", "ucfirst", "ucwords", "uksort", "umask", "uniqid", "unixtojd", "unlink", "unpack", "unregister_tick_function", "unserialize", "unset", "urldecode", "urlencode", "usleep", "usort", "utf8_decode", "utf8_encode", "var_dump", "velocis_autocommit", "velocis_close", "velocis_commit", "velocis_connect", "velocis_exec", "velocis_fetch", "velocis_fieldname", "velocis_fieldnum", "velocis_freeresult", "velocis_off_autocommit", "velocis_result", "velocis_rollback", "virtual", "wddx_add_vars", "wddx_deserialize", "wddx_packet_end", "wddx_packet_start", "wddx_serialize_value", "wddx_serialize_vars", "wordwrap", "write", "writev", "xml_error_string", "xml_get_current_byte_index", "xml_get_current_column_number", "xml_get_current_line_number", "xml_get_error_code", "xml_parse", "xml_parse_into_struct", "xml_parser_create", "xml_parser_free", "xml_parser_get_option", "xml_parser_set_option", "xml_set_character_data_handler", "xml_set_default_handler", "xml_set_element_handler",
				"xml_set_external_entity_ref_handler", "xml_set_notation_decl_handler", "xml_set_object", "xml_set_processing_instruction_handler", "xml_set_unparsed_entity_decl_handler", "xmldoc", "xmldocfile", "xmltree", "xpath_eval", "xpath_eval_expression", "xpath_new_context", "xptr_eval", "xptr_new_context", "xslt_closelog", "xslt_create", "xslt_errno", "xslt_error", "xslt_fetch_result", "xslt_free", "xslt_openlog", "xslt_output_begintransform", "xslt_output_endtransform", "xslt_process", "xslt_run", "xslt_set_error_handler", "xslt_set_sax_handler", "xslt_transform", "yaz_addinfo", "yaz_close", "yaz_connect", "yaz_element", "yaz_errno", "yaz_error", "yaz_hits", "yaz_range", "yaz_record", "yaz_search", "yaz_syntax", "yaz_wait", "yp_first", "yp_get_default_domain", "yp_master", "yp_match", "yp_next", "yp_order", "zend_logo_guid", "zend_test_func", "zend_version"
			};

			Array.Sort(functionList);
			Array.Reverse(functionList);

			return functionList;
		}
	}
}